const fs = require('fs').promises;
const path = require('path');
const { FILE } = require('../../config/constants');
const logger = require('../../utils/logger');
const crypto = require('crypto');

class UploadService {
    static async validateFile(file) {
        if (!file) {
            throw new Error('未上传文件');
        }

        // 检查文件类型
        if (!FILE.ALLOWED_TYPES.includes(file.mimetype)) {
            logger.warn(`文件类型不被允许: ${file.mimetype}`);
            throw new Error(`不支持的文件类型: ${file.mimetype}`);
        }

        // 检查文件大小
        if (file.size > FILE.MAX_SIZE) {
            logger.warn(`文件大小超过限制: 当前${file.size}字节, 最大允许${FILE.MAX_SIZE}字节`);
            throw new Error(`文件大小超过限制: 当前${file.size}字节, 最大允许${FILE.MAX_SIZE}字节`);
        }

        // 检查文件名是否存在
        if (!file.originalFilename) {
            logger.warn('文件名不能为空');
            throw new Error('文件名不能为空');
        }

        // 检查文件名长度
        if (file.originalFilename.length > 255) {
            logger.warn(`文件名过长: ${file.originalFilename.length}字符`);
            throw new Error('文件名长度不能超过255个字符');
        }

        // 检查文件是否已成功保存
        if (!file.filepath) {
            logger.error('文件保存失败');
            throw new Error('文件保存失败');
        }

        // 记录文件上传日志
        logger.info(`文件验证通过: ${file.originalFilename}, 大小: ${file.size}字节, 类型: ${file.mimetype}`);
    }

    static async deleteFile(fileId) {
        // 验证文件ID
        if (!fileId) {
            logger.warn('尝试删除文件时文件ID为空');
            return {
                success: false,
                fileId,
                error: '文件ID不能为空'
            };
        }

        // 防止路径遍历攻击
        if (fileId.includes('..') || fileId.includes('/') || fileId.includes('\\')) {
            logger.warn(`检测到路径遍历攻击尝试: ${fileId}`);
            return {
                success: false,
                fileId,
                error: '无效的文件ID'
            };
        }

        // 限制文件ID长度
        if (fileId.length > 100) {
            logger.warn(`文件ID过长: ${fileId.length}字符`);
            return {
                success: false,
                fileId,
                error: '无效的文件ID'
            };
        }

        const filePath = path.join(__dirname, '../../public/attach/', fileId);
        try {
            await fs.access(filePath);
            await fs.unlink(filePath);
            logger.info(`文件删除成功: ${fileId}`);
            return { success: true, fileId };
        } catch (err) {
            if (err.code === 'ENOENT') {
                logger.warn(`尝试删除不存在的文件: ${fileId}`);
                return {
                    success: false,
                    fileId,
                    error: '文件不存在'
                };
            } else {
                logger.error(`文件删除失败: ${fileId}, 错误: ${err.message}`);
                return {
                    success: false,
                    fileId,
                    error: `删除失败: ${err.message}`
                };
            }
        }
    }

    // 生成安全的文件名
    static generateSecureFilename(originalFilename) {
        // 获取文件扩展名
        const ext = path.extname(originalFilename);
        // 生成随机文件名
        const randomName = crypto.randomBytes(16).toString('hex');
        // 组合新的文件名
        return `${randomName}${ext}`;
    }
}

module.exports = UploadService;
